package com.kaifamiao.object;

// 隐式继承Object类型
public class Human {

    private String fullName;
    private char gender;
    private int age;

    public Human(String name, char gender, int age) {
        fullName = name;
        this.gender = gender;
        this.age = age;
    }

    // 当子类中重新定义了与从父类中继承的 同名、同参、同返回 的方法，
    // 则称子类中的方法 覆盖(或重写) 了从父类继承的同名方法
    @Override
    public boolean equals(Object another){
        // 首先判断两个引用变量的地址是否相等
        if( this == another ) {
            return true;
        }

        // 判断 this 和 another 的类型是否相等
        if( this.getClass() == another.getClass() ) {
            // 将 another 强制类型转换为 Human 类
            Human x = (Human)another;
            System.out.println( "x == gender : " + ( x == another ) ); // true
            // 所有的引用类型的变量都应该使用 equals 来比较 (这里使用String类的equals来比较两个字符串是否相等)
            if( fullName.equals(x.fullName)
                && gender == x.gender
                && age == x.age ) {
                return true;
            }
        }

        return false;
    }

    // 当子类中重新定义了与从父类中继承的 同名、同参、同返回 的方法，
    // 则称子类中的方法 覆盖(或重写) 了从父类继承的同名方法
    @Override
    public String toString(){
        return "大家好，我是" + fullName + "，" + gender + "，今年" + age + "岁" ;
    }

    public static void main(String[] args) {
        Human h = new Human( "李婷" , '女' , 18 );
        System.out.println( System.identityHashCode( h ) );
        System.out.println( h.toString() );

        Human u = new Human( "李婷" , '女' , 18 );
        System.out.println( System.identityHashCode( u ) );
        System.out.println( u.toString() );

        System.out.println( h == u ); // false
        // main 调用 h 的 equals 方法 比较h指向的实例与u指向的实例是否“相等”
        boolean r = h.equals( u );
        System.out.println( r );
    }
}
